package cn.wilson.hrm.service.impl;

import cn.wilson.hrm.doc.CourseDoc;
import cn.wilson.hrm.domain.Course;
import cn.wilson.hrm.domain.CourseDetail;
import cn.wilson.hrm.domain.CourseMarket;
import cn.wilson.hrm.dto.CourseSaveDTO;
import cn.wilson.hrm.feign.client.EsFeignClient;
import cn.wilson.hrm.mapper.CourseDetailMapper;
import cn.wilson.hrm.mapper.CourseMapper;
import cn.wilson.hrm.mapper.CourseMarketMapper;
import cn.wilson.hrm.query.CourseQuery;
import cn.wilson.hrm.service.ICourseService;
import cn.wilson.hrm.utils.AjaxResult;
import cn.wilson.hrm.utils.PageList;
import cn.wilson.hrm.utils.UserContext;
import cn.wilson.hrm.vo.LoginInfo;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

//静态导入
import static cn.wilson.hrm.domain.Course.*;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author wilson.liu
 * @since 2020-04-21
 */
@Service
@Transactional
public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> implements ICourseService {

    @Autowired
    private CourseDetailMapper courseDetailMapper;

    @Autowired
    private CourseMarketMapper courseMarketMapper;

    @Autowired
    private EsFeignClient esFeignClient;


    @Override
    public void saveOrUpdate(CourseSaveDTO courseSaveDTO) {

        //1、保存课程
        Course course = courseSaveDTO.getCourse();

        //课程名字判断
        //如果传递过来的课程名字为空  提示
        if (!StringUtils.hasLength(course.getName())){
            throw new IllegalArgumentException("课程名称不能为空");
        }
        //设置状态
        course.setStatus(STATUS_OFFLINE);
        //获取登录信息
        LoginInfo loginInfo = UserContext.getLoginInfo();
        //设置用户id
        course.setUserId(loginInfo.getUserId());
        //设置用户名
        course.setUserName(loginInfo.getUsername());
        //设置机构id
        course.setTenantId(loginInfo.getTenantId());
        //设置机构名称
        course.setTenantName(loginInfo.getTenantName());
        //执行保存
        baseMapper.insert(course);


        //2、保存课程详情
        CourseDetail courseDetail = courseSaveDTO.getCourseDetail();
        //因为id是一对一，所以我们需要手动设置id
        courseDetail.setId(course.getId());
        //执行保存
        courseDetailMapper.insert(courseDetail);


        //3、保存课程营销
        CourseMarket courseMarket = courseSaveDTO.getCourseMarket();
        //默认保存是否有效
        courseMarket.setValid(CourseMarket.VALID_YX);
        //id和课程的id保持一对一
        courseMarket.setId(course.getId());
        //保存
        courseMarketMapper.insert(courseMarket);
    }

    /**
     *      上线课程
     * @param id
     */
    @Override
    public void onLineCourse(Long id) {
        //根据id查询出来课程
        Course course = baseMapper.selectById(id);
        //要判断课程的状态
        //如果查询出来是上线状态，我们就把课程添加到es中
        if (course.getStatus() != STATUS_OFFLINE){
            throw new IllegalArgumentException("此课程已是上线课程");
        }
        //根据id获取各张表中的一条数据
        CourseMarket courseMarket = courseMarketMapper.selectById(id);
        CourseDetail courseDetail = courseDetailMapper.selectById(id);

        //如果是下线状态，就修改数据库状态为上线，然后同步到es中
        //创建一个CourseDoc实例
        CourseDoc courseDoc = new CourseDoc();
        //将各张表中的属性拷贝到courseDoc里面
        BeanUtils.copyProperties(course,courseDoc);
        BeanUtils.copyProperties(courseMarket,courseDoc);
        BeanUtils.copyProperties(courseDetail,courseDoc);

        //其他在CourseDoc和domain不一样的属性的处理
        courseDoc.setChargeName(courseMarket.getCharge()==0?"免费":"收费");

        //浏览数
        courseDoc.setViewCount(50);
        //购买数
        courseDoc.setBuyCount(21);


        //通过feign调用es服务将文档对象存入es中
        AjaxResult result = esFeignClient.save(courseDoc);
        //判断是否保存到es里面去了
        if (result.isSuccess()){
            //保存成功  修改mysql
            //设置状态为1
            course.setStatus(1);
            //然后发送sql修改
            baseMapper.updateById(course);
        }


    }

    /**
     *      课程的下线
     * @param id
     */
    @Override
    public void offLineCourse(Long id) {
        //根据id把课程信息查询出来
        Course course = baseMapper.selectById(id);
        //可能前端会跳过判断
        if (course == null){
            throw new IllegalArgumentException("所选课程无效");
        }

        //判断状态是否为已下线
        if (course.getStatus() == 0){
            //如果课程已下线  跑出异常
            throw new IllegalArgumentException("所选课程已下线");
        }

        CourseDoc courseDoc = new CourseDoc();
        courseDoc.setId(id);
        //如果是上线状态  那么从es中删除
        AjaxResult offline = esFeignClient.offline(courseDoc);

        //然后修改数据库为下线
        //判断是否删除成功
        if (offline.isSuccess()){
            //删除成功
            course.setStatus(0);
            baseMapper.updateById(course);
        }


    }

    /**
     *      课程的检索
     *          如果在课程这边转  es会接收不到数据
     * @param courseQuery
     * @return
     */
    @Override
    public PageList<CourseDoc> queryCourses(CourseQuery courseQuery) {

        return esFeignClient.searchCourse(courseQuery);
    }
}
